/**
 * “鸡爪”是一个点三条边。
 * 给定N条边，要形成最多的鸡爪，问如何构图，且要求字典序最小
 * 鸡爪数量显然是N/3，关键在于字典序最小的方案
 * 小规模推理以后，发现规律：
 * 当1个鸡爪
 * 1 2
 * 1 3
 * 1 4
 * 当2个鸡爪
 * 1 2
 * 1 3
 * 1 4
 * 1 5
 * 2 3
 * 2 4
 * 当3个鸡爪
 * 1 2
 * 1 3
 * 1 4
 * 1 5
 * 1 6
 * 2 3
 * 2 4
 * 2 5
 * 3 4
 * 当4个鸡爪
 * 1 2
 * 1 3
 * 1 4
 * 1 5
 * 1 6
 * 1 7
 * 2 3
 * 2 4
 * 2 5
 * 2 6
 * 3 4
 * 3 5
 * 因此开头总是1、2、3，后面依次增加即可。 
 */
#include <bits/stdc++.h>
using namespace std;
#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;

int N;
vector<pii> Ans;
int Left;

void proc(){
    Ans.clear();
    if(0 == N) {
        for(int j=0;j<Left;++j){
            Ans.emplace_back(1, j+2);
        }
        return;
    }
    // if(1 == N){
    //     Ans.emplace_back(1, 2);
    //     Ans.emplace_back(1, 3);
    //     Ans.emplace_back(1, 4);
    //     return;
    // }

    // if(2 == N){
    //     Ans.emplace_back(1, 2);
    //     Ans.emplace_back(1, 3);
    //     Ans.emplace_back(1, 4);
    //     Ans.emplace_back(1, 5);
    //     Ans.emplace_back(2, 3);
    //     Ans.emplace_back(2, 4);
    //     return;
    // }

    int n = N + 3;
    for(int i=2;i<=n;++i){
        Ans.emplace_back(1, i);
    }
    for(int j=0,i=n+1;j<Left;++j,++i){
        Ans.emplace_back(1, i);
    }
    if(N > 1)
    for(int i=3;i<n;++i){
        Ans.emplace_back(2, i);
    }
    for(int i=4;i<n-1;++i){
        Ans.emplace_back(3, i);
    }
    return;
}

void work(){   
    cin >> N;
    Left = N % 3;
    N = N / 3;
    proc();
    for(const auto & p : Ans) cout << p.first << " " << p.second << "\n";
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	cin >> nofkase;
	while(nofkase--) work();
	return 0;
}